#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <unordered_map>

/*
思路
回文串中除可能出现的中间字符外，均成对出现，所以只需要统计相同字符双数个个数就可以。如果统计结束后小于传入长度，那么最长长度加1即可。
复杂度
时间复杂度: 
O(n)
空间复杂度: 
𝑂(1)

*/

using namespace std;

void print_map(const unordered_map<char, int>& mp) {
    for (unordered_map<char, int>::const_iterator it = mp.begin(); it != mp.end(); it++) {
        cout << it->first << " : " << it->second <<endl;
    }
    cout <<endl;
}

class Solution {
public:
    int longestPalindrome(string s) {
        unordered_map<char, int> dict;

        for (size_t i = 0; i < s.size(); i++)
        {
            if (dict.find(s[i]) != dict.end()) {
                dict[s[i]] += 1;
            }
            else {
                dict.insert(pair<char, int>(s[i], 1));
            }
        }
        int length = 0;
        int jishu_flag = 0;
        for (auto it = dict.begin(); it != dict.end(); it++){
            if (it->second % 2) {
                jishu_flag = 1;
                length += it->second - 1;
            }
            else {
                length += it->second;
            }
        }
        if (jishu_flag > 0) length += 1;
        
        return length;
    }
};